<?php

namespace App\Services;

use EasyWeChat\Factory;
use App\Models\WxPayModel;

/**
 * 微支付服务
 */
trait WxPayService
{
    protected $wx_min_app_pay;

    /**
     * 微信小程序支付配置参数
     */
    protected function wxMinAppPayConfig()
    {
        $configModel = WxPayModel::select('miniprogram_app_id', 'mch_id', 'mch_api_v2_key', 'callback_url', 'payment_mode', 'api_certificate_path', 'api_certificate_key')->first();

        if ($configModel) {
            $app_id = $configModel->miniprogram_app_id;
            $wx_mch_id = $configModel->mch_id;
            $wx_mch_key = $configModel->mch_api_v2_key;
            $notify_url = $configModel->callback_url;
            $sandbox = $configModel->payment_mode;
            $cert_path = $configModel->api_certificate_path;
            $key_path = $configModel->api_certificate_key;
            // dd($wx_mch_id, $wx_mch_key);
            if (!$wx_mch_id || !$wx_mch_key) {
                return false;
            }
        } else {
            return false;
        }
        $config = [
            // 必要配置
            'app_id'             => $app_id,
            'mch_id'             => $wx_mch_id,
            'key'                => $wx_mch_key,   // API 密钥
            // 如需使用敏感接口（如退款、发送红包等）需要配置 API 证书路径(登录商户平台下载 API 证书)
            'cert_path'          => (string)$cert_path, // XXX: 绝对路径！！！！
            'key_path'           => (string)$key_path,      // XXX: 绝对路径！！！！
            'notify_url'         => (string)$notify_url,     // 你也可以在下单时单独设置来想覆盖它
            'sandbox' => (bool)$sandbox, // 设置为 false 或注释则关闭沙箱模式
        ];
        // dd($config);
        $app = Factory::payment($config);
        $this->wx_min_app_pay = $app;
        return true;
    }

    /**
     * 微信小程序支付
     * @param string $body
     * @param string $out_trade_no
     * @param int $total_fee
     * @param string $notify_url
     * @param string $openid
     * @return array
     */
    public function wxMinAppPay($body, $out_trade_no, $total_fee, $notify_url, $openid)
    {
        $config = $this->wxMinAppPayConfig();
        if (!$config) {
            return ['code' => 0, 'msg' => '支付配置错误'];
        }
        $app = $this->wx_min_app_pay;
        // dd(request()->getClientIp());
        $result = $app->order->unify([
            'body' => $body,
            'out_trade_no' => $out_trade_no,
            'total_fee' => $total_fee,
            'spbill_create_ip' => request()->getClientIp(), // 可选，如不传该参数，SDK 将会自动获取相应 IP 地址
            'notify_url' => $notify_url, // 支付结果通知网址，如果不设置则会使用配置里的默认地址
            'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
            'openid' => $openid,
        ]);

        return ['code' => 1, 'data' => $result];
    }
}
